#ifndef NLData_h
#define NLData_h

#include <stdio.h>
#include <string>
#include <unistd.h>
#include <list>
#include <vector>

using namespace std;

// NL数据类型
typedef enum NLDataType
{
    NLDataType_Unknow = -1,
    NLDataType_Text = 0,
    NLDataType_Barcode,
    NLDataType_Date,
    NLDataType_Counter,
}NLDataType;

// 数据基类
class CNLDataBase
{
public:
    NLDataType m_type = NLDataType_Unknow;

    // 控件位置
    string m_strFOX = "0";
    string m_strFOY = "0";
};

class CNLDataText : public CNLDataBase
{
public:
    // 字体信息
    string m_strFontName = "0";
    string m_strFontFieldOrientation = "N";
    string m_strFontCharacterHeight = "10";
    string m_strFontWidth = "10";

    // 文本内容
    string m_strTextContext;
};

class CNLDataBarcode : public CNLDataBase
{
public:
    // 条码类型
    int m_nBarcodeType = -1;

    // 条码参数
    string m_strBarcodeParam = "";

    // 条码内容
    string m_strBarcodeContext;
};

// 霓廊打印机数据管理
class CNLData
{
public:
    CNLData();

    virtual ~CNLData();

    // 添加一个数据包
    bool AddPackageData(const string& strFs);

    // 文本转换成霓廊数据
    bool TranslateTextData(vector<char>& vNLPackage);

    // 文本数据部分转换成霓廊数据
    bool TranslateTextContext(vector<char>& vNLPackage);

    // 条码转换成霓廊数据
    bool TranslateBarcodeData(vector<char>& vNLPackage);

    // 条码内容输入到标签条码0E
    bool TranslateBarcodeContext(vector<char>& vNLPackage);

    // 选择编辑的标签
    bool TranslateStart(vector<char>& vNLPackage);

    // 打印标签
    bool TranslatePrint(vector<char>& vNLPackage);

private:
    // ZPL打印机角度转NL打印机角度
    string GetNLAngle(string strFontFieldOrientation);

    // 判断字符串a是否和字符串b相同(不区分大小写)
    static bool StringEqual(const std::string& a, const std::string& b);

    // 对字符串strSrc使用分隔符strSplit分割,分割结果存入vector中
    static vector<string> StringSplit(const string& strSrc, const string& strSplit);

    // 对字符串str两边剪枝
    static std::string trim(const std::string& str);

    // 向数据包vPackage中添加字符串strSource
    static void AddVectorString(vector<char>& vPackage, const string& strSource);
    // 向数据包vPackage中添加整形数nValue, nLen表示是否按长度填充0, -1表示不填充
    static void AddVectorString(vector<char>& vPackage, int nValue, int nLen);

    // 解析文本数据
    static bool ParasePackageTextData(const std::list<std::string>& listParam, CNLDataText& datatext);
    static bool ParasePackageBarcodeData(const std::list<std::string>& listParam, CNLDataBarcode& data);
public:
    // 原点
    string m_strLHX = "0";
    string m_strLHY = "0";

    // 标签序号
    static int m_nPrintNameIndex;

    // 标签名称
    string m_strLabelName = "0";

    // 标签宽度和高度
    string m_strLabelWidth = "100";
    string m_strLabelHeight = "100";

    // 打印标签数量
    string m_strPrinterCount = "1";

    // 文本内容
    list<CNLDataText> m_listTextData;

    // 条码内容
    list<CNLDataBarcode> m_listBarcodeData;
};

#endif // NLData_h